home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
WREADTIM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
10KB
|
301 lines
static char wreadtime_prg1[] =
"@(#)char *wreadtimew(WINDOW *win,int f, char *tstr) - Zeit einlesen (Curses-win)";
static char wreadtime_prg2[] =
"@(#)char *readtimew(int f, char *tstr) - Zeit einlesen (Curses-stdscr)";
static char readtime_ver[] = "@(#)v1.00/kr ; 01.08.91";
/* wreadtimew Einlesen eines Zeit-String unter Curses
**
** Autor Klaus Rath
**
** Deklaration char *wreadtimew(WINDOW *win,int format,char *timestring);
** char *readtimew(int format, char *timestring);
**
** Compilation DOS: bcc -c readtime.c c:\usr\local\lib\libkrc_s.lib
** UNIX: cc -c readtime.c /u1/usr/lib/libkrc.a
** ( unter DOS kann die Funktion im small-Modell laufen )
**
** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
** chem Format eingelesen werden soll.
** Z.Zt. erlaubte Formate (siehe datum.h) :
** hh:mm[:ss] -- Formate 1,2
** hh.mm[.ss] -- Formate 3,4
** hhmm[ss] -- Datenbankformate 5,6 (DDB/4)
** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
** des Ergebnisses erwartet.
**
** Rückgabe (char *) auf timestring
**
** Anmerkungen Die Funktion prüft nicht die Validität der eingegebenen
** Zeit - dies sollte die aufrufende Funktion selbst tun,
** bzw. den Test durch checktime() durchführen lassen.
** Die Funktion benutzt zum Einlesen wgetch(win).
** wreadtime() stellt dem Aufrufer eine Maske des angeforder-
** ten Format zur Verfügung ( z.B. __:__:__ ), wobei die
** Unterstriche durch Zahlen gefüllt werden müssen. Die
** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
** nicht editierbar und werden automatisch erzeugt. Eine
** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
** immer, hinter der letzten Position genügt ein beliebiges
** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
**
** Änderungen 1.00 ; 01.08.91
** - Erste Version für CURSES, basiert auf Version 1.10 von
** readtime()
** 1.01 ; 12.12.91
** - Einlesefehler beseitigt: obwohl für ein WINDOW *win
** konzipiert, wurde in wreadtime() mit getch() gelesen.
*/
#include <curses.h>
#include <stdio.h>
#include <string.h>
#ifdef __TURBOC__
#define ANSI
#define KR_SYS
#include <stdlib.h>
#include "datum.h"
#include "util.h"
#else
#include "/u1/usr/include/datum.h"
#include "/u1/usr/include/util.h"
#endif
#ifdef ANSI
char *wreadtimew(WINDOW *win,int format, char *tstring)
#else
char *wreadtimew(win,format,tstring)
WINDOW *win;
int format;
char *tstring;
#endif
{
/* Variablendefinitionen :
*/
int trennpos1 = 2, /* Positionen von Trennzeichen */
trennpos2 = 5;
int trenner; /* das Trennzeichen */
int pos = 0; /* Aktuelle Position */
int maxpos = 11; /* Letztmögliche Position */
int Max = 0; /* Schalter, ob am Ende */
int ch; /* Einzulesendes Zeichen */
int def_char = '0'; /* Default-Character */
/* Evtl. 1. Zeichen berücksichtigen :
*/
if ( tstring[0] == NULL ) {
tstring[0] = def_char;
}
else {
pos = 1;
}
/* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
*/
switch ( format ) {
case TI_HM_D :
trenner = ':';
maxpos = 6;
tstring[trennpos1] = trenner;
tstring[1] =
tstring[3] =
tstring[4] = def_char;
tstring[5] = '\0';
trennpos2 = 99;
wprintw(win,"%c0:00",tstring[0]);
wprintw(win,"\b\b\b\b");
break;
case TI_HM_P :
trenner = '.';
maxpos = 6;
tstring[trennpos1] = trenner;
tstring[1] =
tstring[3] =
tstring[4] = def_char;
tstring[5] = '\0';
trennpos2 = 99;
wprintw(win,"%c0.00",tstring[0]);
wprintw(win,"\b\b\b\b");
break;
case TI_HMS_P :
trenner = '.';
maxpos = 9;
tstring[trennpos1] =
tstring[trennpos2] = trenner;
tstring[1] =
tstring[3] =
tstring[4] =
tstring[6] =
tstring[7] = def_char;
tstring[8] = '\0';
wprintw(win,"%c0.00.00",tstring[0]);
wprintw(win,"\b\b\b\b\b\b\b");
break;
case TI_HM_DB :
maxpos = 5;
tstring[1] =
tstring[2] =
tstring[3] = def_char;
tstring[4] = '\0';
trennpos1 =
trennpos2 = 99;
wprintw(win,"%c000",tstring[0]);
wprintw(win,"\b\b\b");
break;
case TI_HMS_DB :
maxpos = 7;
tstring[1] =
tstring[2] =
tstring[3] =
tstring[4] =
tstring[5] = def_char;
tstring[6] = '\0';
trennpos1 =
trennpos2 = 99;
wprintw(win,"%c00000",tstring[0]);
wprintw(win,"\b\b\b\b\b");
break;
case TI_HMS_D :
default :
trenner = ':';
maxpos = 9;
tstring[trennpos1] =
tstring[trennpos2] = trenner;
tstring[1] =
tstring[3] =
tstring[4] =
tstring[6] =
tstring[7] = def_char;
tstring[8] = '\0';
wprintw(win,"%c0:00:00",tstring[0]);
wprintw(win,"\b\b\b\b\b\b\b");
break;
} /* ENDE: switch(format) */
/* Evtl. noch ein Rückschritt :
*/
if ( !pos ) {
wprintw(win,"\b");
}
wrefresh(win);
/* Tastendrucke abholen, bis maxpos :
*/
while ( pos < maxpos + 1 ) {
if ( pos == 0 ) {
tstring[pos] = def_char;
}
wrefresh(win);
/* Falls fertig, String zurückgeben :
*/
if ( pos == maxpos ) {
tstring[pos] = '\0';
return(tstring);
}
/* An eventuellen Trennerpositionen den passenden Trenner einfügen
** und den nächsten Schleifendurchlauf abwarten :
*/
if ( pos == trennpos1 || pos == trennpos2 ) {
wprintw(win,"%c",trenner);
wrefresh(win);
pos++;
continue;
}
/* An der vorletzten Position sind alle Tasten erlaubt, denn nur
** BACKSPACE bleibt in der Funktion :
*/
if ( pos == maxpos - 1 ) {
Max = 1;
}
ch = wgetch(win);
/* Auswertung der gedrückten Taste :
*/
switch ( ch ) {
/* Nicht Zulässiges ignorieren :
*/
case NULL:
case -1 :
break;
/* Abbruchmöglichkeiten :
*/
case 27 :
tstring[0] = '\0';
return(tstring);
case 10 :
cas